<?php
/**
 * Created by PhpStorm
 * author: bxm
 * Date: 2023/3/20
 * Time: 10:08
 */

namespace app\common\service;

class PackService
{
    //压缩队列
    protected $packQueue = [];
    //调试
    protected $debug = false;
    //驱动类
    protected $driveHandle;
    //压缩文件最后存放的目录路径
    protected $dirPath;
    //设置打包后压缩包的名称
    protected $packName;
    //最后保存的完整可访问的压缩包路径
    protected $saveZipPath;

    /**
     * BaseService constructor.
     * @param string $tenantCode 分区代码
     * @param bool $debug 开启调试
     */
    public function __construct(bool $debug = false){
        $this->debug = $debug;
        $this->driveHandle = new \ZipArchive();
    }

    /**
     * 开启调试
     * @author chenja01 2021年12月2日14:19:19
     * @param bool $debug 是否开启调试
     * @return $this
     */
    public function debug(bool $debug = true){
        $this->debug = $debug;
        return $this;
    }

    /**
     * 设置压缩包保存路径
     * @author chenja01 2021年12月8日17:43:04
     * @param bool $zipPath 压缩包保存路径
     * @return $this
     */
    public function setSaveZipName(string $zipName){
        $this->saveZipPath = "D:/ziptest/" . $zipName. '-'. time() . ".zip";
        $dir = dirname($this->saveZipPath);
        if (!is_dir($dir)) self::createDirectory($dir);
        return $this;
    }

    /**
     * 创建文件夹
     * @param string $path 路径
     * @param int $mode 授权
     * @param bool $recursive
     * @author jinanav 2021/12/11 21:00
     * @return  bool
     */
    public static function createDirectory(string $path,int $mode = 0775,bool $recursive = true)
    {
        if (is_dir($path)) {
            return true;
        }
        $parentDir = dirname($path);
        if ($recursive && !is_dir($parentDir) && $parentDir !== $path) {
            static::createDirectory($parentDir, $mode, true);
        }
        try {
            if (!mkdir($path, $mode)) {
                return false;
            }
        } catch (\Exception $e) {
            if (!is_dir($path)) {
                return false;
            }
        }

        try {
            return chmod($path, $mode);
        } catch (\Exception $e) {
            return false;
        }
    }

    /**
     * 设置临时保存的目录
     * @author chenja01 2021年12月2日14:38:36
     * @param string $path 任务列表
     * @return $this
     */
    public function setDirPath(string $path){
        $this->dirPath = $path;
        return $this;
    }

    /**
     * 设置压缩文件名
     * @author chenja01 2021年12月2日14:39:38
     * @param string $name 压缩文件名
     * @return $this
     */
    public function setPackName(string $name){
        $this->packName = $name;
        return $this;
    }



    /**
     * 设置文件队列
     * @author chenja01 2021年12月2日14:23:02
     * @param array $queue 文件队列
     * @return $this
     */
    public function setPackQueue(array $queue){
        $this->packQueue = array_merge($this->packQueue,$queue);
        return $this;
    }

    /**
     * 追加一个需要压缩的文件
     * @author chenja01 2021年12月2日14:25:41
     * @param string $element 文件名
     * @return $this
     */
    public function enqueue(string $element){
        array_push($this->packQueue,$element);
        return $this;
    }

    /**
     * 导入文件路径到压缩队列
     * @author chenja01 2021年12月6日15:59:57
     * @param string $path 路径
     * @return $this
     */
    public function appendPath(string $path){
        $fileArray = $this->setFileByPath($path);
        $this->packQueue = array_merge($this->packQueue,$fileArray);
        return $this;
    }

    /**
     * 递归读取目录
     * @author chenja01 2021年12月6日15:59:57
     * @param string $dir 目录地址
     * @return array
     */
    public function setFileByPath(string $dir){
        $result = array();
        if (is_dir($dir)){
            $file_dir = scandir($dir);
            foreach($file_dir as $file){
                if ($file == '.' || $file == '..'){
                    continue;
                }
                elseif (is_dir($dir.$file)){
                    $result = array_merge($result, $this->setFileByPath($dir.$file.'/'));
                }
                else{
                    array_push($result, $dir.$file);
                }
            }
        }
        return $result;
    }

    /**
     * 将文件追加到压缩包
     * @author chenja01 2021年12月8日17:39:40
     */
    public function build(){
        foreach ($this->packQueue as $v){
            $this->driveHandle->addFile($v,basename($v));
        }
    }

    /**
     * 生成zip包并返回
     * @author chenja01 2021年12月8日17:40:43
     * @return string
     */
    public function result(){
        try {
            if($this->driveHandle->open($this->saveZipPath,\ZipArchive::CREATE) === true){
                //将每个文件放入到压缩包
                $this->build();
                //关闭压缩包句柄
                $this->driveHandle->close();
                return $this->saveZipPath;
            }
            return false;
        }catch (\Exception $e){
            return false;
        }
    }

    /**
     * 打印调试信息
     * @author chenja01 2021年12月2日14:28:02
     * @param string $element 文件名
     */
    public function outDebugInfo(){
        $json = [
            '文件队列'    => $this->packQueue,
            '打包后的路径' => $this->saveZipPath
        ];
        exit(json_encode($json,JSON_UNESCAPED_UNICODE));
    }
}